'''
8.4 特殊方法
    除了实例方法,类方法,静态方法以外,类中还有2个特殊的方法:构造方法和析构方法,这2个方法都是系统内置方法.
'''

'''
8.4.1 构造方法
    构造方法(即__init__()方法)是类中定义的特殊方法,该方法负责在创建对象时对对象进行初始化.每个类默认都有一个__init__()方法,如果一个类中显式定义
了__init__()方法,那么创建对象是调用显式定义的__init__()方法;否则调用默认的__init__()方法.
    __init__()方法可以分为无参构造方法和有参构造方法:
    (1)当使用无参构造方法创建对象时,所有对象的属性都有相同的初始值
    (2)当使用有参构造方法创建对象时,所有对象的属性可以有不同的初始值
'''
class Car:
    def __init__(self):
        self.color = '红色'
    def drive(self):
        print(f'车的颜色为{self.color}')
car_1 = Car()
car_2 = Car()
print(car_1.color)
print(car_2.color)
car_1.drive()
car_2.drive()
print('-------------------')
# 系统在创建car_1和car_2两个对象时,同时调用__init__()方法对其进行了初始化

class Car_one:
    def __init__(self,color):
        self.color = color
    def drive(self):
        print(f'车的颜色是{self.color}')
car_one1 = Car_one('红色')
car_one2 = Car_one('蓝色')
car_one1.drive()
car_one2.drive()
print('-------------------')
# 从以上结果看出,对象car_one1 和对象car_one2 在调用drive方法时都成功访问了color属性,且它们的属性具有不同的初始值.

'''
8.4.2 析构方法
    析构方法(即__del__()方法)是销毁对象时系统自动调用的特殊方法.每个类默认都有一个__del__()方法.如果一个类中显式定义了__del__()方法,
那么销毁该类的对象时会调用显式定义的__del__()方法;如果一个类中没有定义__del__()方法,那么销毁该类的对象时会调用默认的__del__()方法.
'''
# 下面定义一个Car_two类,闹喊构造方法和析构方法,然后创建Car_two类的对象,之后分别在del语句执行前后访问Car_two类的对象的属性:
class Car_two:
    def __init__(self):
        self.color = '蓝色'
    def __del__(self):
        print('对象被销毁')
car_two = Car_two()
print(car_two.color)
del car_two
# print(car_two.color) # NameError: name 'car_two' is not defined
# 从以上结果来看,程序在删除Car_two类的对象之前成功访问了color属性;在删除Car_two类的对象car后调用了析构方法,打印'对象被销毁语句';
# 在car_two对象被销毁后,因无法使用Car_two类的对象访问属性二出现错误信息.
